home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 January / macformat46.iso / Shareware Plus / Developers / Library / Grant's CGI Framework / Grant's CGI Framework / grantscgi / Util / MiscUtil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-20  |  2.4 KB  |  131 lines

  1. /*****
  2.  *
  3.  *    MiscUtil.c
  4.  *
  5.  *    This is a support file for "Grant's CGI Framework".
  6.  *    Please see the license agreement that accompanies the distribution package
  7.  *    for licensing details.
  8.  *
  9.  *    Copyright ©1995,1996 by Grant Neufeld
  10.  *    grant@acm.com
  11.  *    http://arpp.carleton.ca/cgi/framework/
  12.  *
  13.  *****/
  14.  
  15. #include "MiscUtil.h"
  16.  
  17. /*  */
  18. UInt32
  19. UtilRandomFromLong ( UInt32 maxNum )
  20. {
  21.     UInt32    randomNumber;
  22.     Boolean    gotNumber;
  23.     short    escapeCount;
  24.     
  25.     gotNumber = false;
  26.     escapeCount = 8;    /* max number of times through the loop */
  27.     
  28.     if ( maxNum == 0 )
  29.     {
  30.         randomNumber = 0;
  31.         gotNumber = true;
  32.     }
  33.     if ( maxNum < 65536 )
  34.     {
  35.         do
  36.         {
  37.             escapeCount--;
  38.             /* maxNum is short, so just get a short value */
  39.             randomNumber = UtilRandomShort ();
  40.             if ( randomNumber > maxNum )
  41.             {
  42.                 if ( maxNum <= 4096 )
  43.                 {
  44.                     /* get the mod of the randomNumber if the maxNum is small enough
  45.                         to not be too biased when using it to mod */
  46.                     randomNumber %= maxNum;
  47.                     gotNumber = true;
  48.                 }
  49.                 else
  50.                 {
  51.                     /* need to try again */
  52.                 }
  53.             }
  54.             else
  55.             {
  56.                 gotNumber = true;
  57.             }
  58.         } while ( !gotNumber && (escapeCount > nil) );
  59.     }
  60.     else
  61.     {
  62.         do
  63.         {
  64.             escapeCount--;
  65.             /* maxNum is short, so just get a short value */
  66.             randomNumber = UtilRandomLong ();
  67.             if ( randomNumber > maxNum )
  68.             {
  69.                 if ( maxNum <= 1677216 )
  70.                 {
  71.                     /* get the mod of the randomNumber if the maxNum is small enough
  72.                         to not be too biased when using it to mod */
  73.                     randomNumber %= maxNum;
  74.                     gotNumber = true;
  75.                 }
  76.                 else
  77.                 {
  78.                     /* need to try again */
  79.                 }
  80.             }
  81.             else
  82.             {
  83.                 gotNumber = true;
  84.             }
  85.         } while ( !gotNumber && (escapeCount > nil) );
  86.     }
  87.     
  88.     if ( !gotNumber )
  89.     {
  90.         /* too many loops, but still didn't get the number, just div 2 until one is found */
  91.         do
  92.         {
  93.             randomNumber /= 2;
  94.             if ( randomNumber <= maxNum )
  95.             {
  96.                 gotNumber = true;
  97.             }
  98.         } while ( !gotNumber );
  99.     }
  100.     
  101.     return randomNumber;
  102. } /* UtilRandomFromLong */
  103.  
  104.  
  105. /* returns a random unsigned number (32 bits long) */
  106. UInt32
  107. UtilRandomLong ( void )
  108. {
  109.     UInt32    randomNumber;
  110.     
  111.     *((UInt16 *)(&randomNumber)) = Random ();
  112.     *((UInt16 *)(&randomNumber) + 2) = Random ();
  113.     
  114.     return randomNumber;
  115. } /* UtilRandomLong */
  116.  
  117.  
  118. /* returns a random unsigned number (16 bits short) */
  119. #if 0 /* moved to macro in header */
  120.     UInt16
  121.     UtilRandomShort ( void )
  122.     {
  123.         UInt16    randomNumber;
  124.         
  125.         randomNumber = Random ();
  126.         
  127.         return randomNumber;
  128.     } /* UtilRandomShort */
  129. #endif /* 0 */
  130.  
  131.